#include<sys/types.h>
#include<signal.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

/*
 * shell_SIGHUP.out s d s >A.txt &
 * 等待若干秒后，关闭shell窗口，或者发送SIGHUP信号给该SHELL进程
 * 
 * 可以观察到：shell会将SIGHUP信号发送给所有由SHELL创建的进程组的所有进程
 * 非SHELL创建的进程组的进程则不会收到该信号 
 *
 * SIGHUP信号的默认处理方式：终止该进程
 * exe shell_SIGHUP.out s d s>A.txt &
 * 则SIGHUP信号只会发送到前台进程组的所有进程
 * */


void sigcatch(int signo)
{
	printf("%d\n",signo);
	if (signo == SIGHUP)
	{
		printf("catch SIGHUP %u %u %u %u\n",getpid(),getppid(),getpgrp(),getsid(0));
	}
}

int main(int argc,char *argv[])
{
	pid_t pid;
	int i;

	printf("%u %u %u %u\n",getpid(),getppid(),getpgrp(),getsid(0));
	if (signal(SIGHUP, sigcatch) < 0)
	{
		exit(1);
	}

	for (i = 1; i < argc; i++)
	{
		pid = fork();
		if (pid < 0)
		{
		} else if (pid == 0)
		{
			if (argv[i][0] != 's')
			{
				setpgid(0,0);
			}
			printf("%u %u %u %u\n",getpid(),getppid(),getpgrp(),getsid(0));
			sleep(10);
			exit(0);
		}
	}
	
	sleep(10);
	return 0;
}
